<?php

namespace Reportes\Controller\Service;

use Zend\Db\Adapter\Adapter;
use Componentes\Controller\UtilsArrayController;
use Componentes\Controller\VariablesGlobales;
use Reportes\Controller\Service\GenericService;
use Maestros\Controller\Service\PersonaService;
use Maestros\Controller\Service\LapsoAcademicoService;
use Transaccion\Controller\Service\SemestreService;
use Transaccion\Controller\Service\EspecialidadService;
use Transaccion\Controller\Service\HorarioService;
use Transaccion\Controller\Service\ExpedienteService;
use Inscripcion\Controller\Service\ControlInscripcionService;
use Transaccion\Controller\Service\OrganizacionSeccionService;
use Reportes\Model\Dao\PlanillaDAO;
use Anouar\Fpdf\Fpdf;
use Anouar\Fpdf\FpdfServiceProvider;
use Componentes\Controller\Seguridad;
use Maestros\Controller\Service\MateriaService;

class PlanillaService extends GenericService {

    /**
     * @var Zend\Db\Adapter\Adapter 
     */
    private $dbAdapter;
    private static $datosAcademicosService;

    /**
     * @param \Zend\Db\Adapter\Adapter $dbAdapter
     */
    private function __construct(Adapter $dbAdapter) {
        $this->dbAdapter = $dbAdapter;
    }

    public static function getInstance($adapter) {
        if (self::$datosAcademicosService == null) {
            self::$datosAcademicosService = new PlanillaService($adapter);
        }
        return self::$datosAcademicosService;
    }

    public function getPlanillaDao() {
        return PlanillaDAO::getInstance($this->dbAdapter);
    }

    public function getPlanilla($cedula) {
        $ancho1 = 196;
        $alto1 = 4;
        $lapsoInscripcion = VariablesGlobales::$lapsoDeInscripcion;
        $servicioLapso = LapsoAcademicoService::getInstance($this->dbAdapter);
        $lapso = $servicioLapso->obtenerLapsoAcademicoSegunIdLapso($lapsoInscripcion);
        $servicioMateria = MateriaService::getInstance($this->dbAdapter);
        $output = $servicioMateria->getMateriasInscritasSegunCedulaYLapso($cedula, $lapsoInscripcion);
        $nombreEspecialidad = $output['data'][0]['_especialidad'];
        $arrayMateriasInscritas = $output['data'];
        $pdf = new FPDF('P', 'mm', 'Letter');
        $pdf->AddPage();
        $pdf->SetFont('Arial', 'B', 8, 'h');
        $this->header($pdf);
        $pdf->SetFillColor(200);
        $pdf->Cell($ancho1, $alto1, utf8_decode('PLANILLA DE INSCRIPCIÓN'), 1, 1, 'C', true);
        $fecha = date("d-m-Y");
        $hora = date("h:i:s A");
        $this->datosPersonales($pdf, $cedula, $nombreEspecialidad, $lapso, $fecha, $hora);
        $pdf->SetFillColor(250);
        $pdf->SetFont('Arial', 'B', 8, 'h');
        $pdf->Cell($ancho1, $alto1, 'MATERIAS INSCRITAS', 1, 1, 'C', true);
        $pdf->Ln(2);
        $this->materiasInscritas($pdf, $arrayMateriasInscritas);
        $pdf->Ln(1);
        $this->horario($pdf, $output, $lapso, $cedula);
        $fecha = date("Y-m-d h:i:s");
        $this->codigoSeguridad($pdf, $cedula, $fecha, $hora, $ancho1, $alto1);
        $pdf->Ln(10);
        $this->footer($pdf);
        $pdf->Output();
    }

    public function datosPersonales($pdf, $cedula, $nombreEspecialidad, $lapso, $fecha, $hora) {
        $alto1 = 4;
        $servicioAlumno = PersonaService::getInstance($this->dbAdapter);
        $alumno = $servicioAlumno->obtenerPersonaSegunCedula($cedula);
        $pdf->Ln(2);
        $tamañoLetra = 8;
        $pdf->SetFont('Arial', '', $tamañoLetra);
        $pdf->Cell(13, $alto1, utf8_decode("Cédula :"), 0, 0);
        $pdf->SetFont('Arial', 'B', $tamañoLetra);
        $pdf->Cell(17, $alto1, $alumno->getCedula(), 0, 0);
        $pdf->SetFont('Arial', '', $tamañoLetra);
        $pdf->Cell(29, $alto1, 'Nombres y Apellidos:', 0, 0);
        $pdf->SetFont('Arial', 'B', $tamañoLetra);
        $pdf->Cell(122, $alto1, utf8_decode($alumno->getNombre1()) . "  " . utf8_decode($alumno->getNombre2()) . "  " . utf8_decode($alumno->getApellido1()) . "  " . utf8_decode($alumno->getApellido2()), 0, 1);
        $pdf->SetFont('Arial', '', $tamañoLetra);
        $pdf->Cell(14, $alto1, 'Periodo :', 0, 0);
        $pdf->SetFont('Arial', 'B', $tamañoLetra);
        $pdf->Cell(15, $alto1, $lapso->getDescripcion(), 0, 1);
        $pdf->SetFont('Arial', '', $tamañoLetra);
        $pdf->Cell(20, $alto1, 'Especialidad :', 0, 0);
        $pdf->SetFont('Arial', 'B', $tamañoLetra);
        $pdf->Cell(20, $alto1, utf8_decode($nombreEspecialidad), 0, 1);
        $pdf->SetFont('Arial', '', $tamañoLetra);
        $pdf->Cell(26, $alto1, 'Fecha de Emision :', 0, 0);
        $pdf->SetFont('Arial', 'B', $tamañoLetra);
        $pdf->Cell(20, $alto1, $fecha, 0, 0);
        $pdf->SetFont('Arial', '', $tamañoLetra);
        $pdf->Cell(9, $alto1, 'Hora :', 0, 0);
        $pdf->SetFont('Arial', 'B', $tamañoLetra);
        $pdf->Cell(20, $alto1, $hora, 0, 0);
        $pdf->Ln(7);
    }

    public function materiasInscritas($pdf, $arrayMateriasInscritas) {
        $ancho1 = 20;
        $ancho2 = 137;
        $ancho3 = 10;
        $ancho4 = 13;
        $ancho5 = 7;
        $ancho6 = 9;
        $alto1 = 3;
        $alto2 = 4;
        $creditos = 0;
        $longitud = count($arrayMateriasInscritas);
        $pdf->SetFillColor(200);
        $pdf->SetFont('Arial', 'B' . 'I', 9);
        $pdf->Cell($ancho1, $alto2, utf8_decode('Código'), 1, 0, 'L', true);
        $pdf->Cell($ancho2, $alto2, 'Nombre de la Unidad Curricular', 1, 0, 'L', true);
        $pdf->Cell($ancho3, $alto2, utf8_decode('Créd.'), 1, 0, 'L', true);
        $pdf->Cell($ancho4, $alto2, utf8_decode('Secc.'), 1, 0, 'L', true);
        $pdf->Cell($ancho5, $alto2, utf8_decode('T'), 1, 0, 'L', true);
        $pdf->Cell($ancho6, $alto2, utf8_decode('Fase'), 1, 0, 'L', true);
        $pdf->Ln(5);
        for ($i = 0; $i < $longitud; $i++) {
            $pdf->Ln(0.5);
            $pdf->SetFont('Arial', '', 5.8);
            $pdf->Cell($ancho1, $alto1, $arrayMateriasInscritas[$i]['codigoExterno'], 1, 0);
            $pdf->Cell($ancho2, $alto1, utf8_decode($arrayMateriasInscritas[$i]['nombre']), 1, 0);
            $creditos = $creditos + $arrayMateriasInscritas[$i]['credito'];
            $pdf->Cell($ancho3, $alto1, $arrayMateriasInscritas[$i]['credito'], 1, 0, 'C');
            $pdf->Cell($ancho4, $alto1, $arrayMateriasInscritas[$i]['_seccion'], 1, 0);
            $pdf->Cell($ancho5, $alto1, $arrayMateriasInscritas[$i]['_trayectoSemestre'], 1, 0, 'C');
            if (($arrayMateriasInscritas[$i]['_periodoFase']) == 'FASE 1') {
                $pdf->Cell($ancho6, $alto1, '1', 1, 1, 'C');
            } else if (($arrayMateriasInscritas[$i]['_periodoFase']) == 'FASE 2') {
                $pdf->Cell($ancho6, $alto1, '2', 1, 1, 'C');
            } else {
                $pdf->Cell($ancho6, $alto1, 'Anual', 1, 1);
            }
        }
        $pdf->Ln(1);
        $pdf->SetFont('Arial', 'B' . 'I', 8);
        $pdf->SetX(153);
        $pdf->Cell(14, 3, 'Total U.C', 1, 0, 'C', true);
        $pdf->Cell($ancho3, 3, $creditos, 1, 1, 'C', true);
    }

    public function footer($pdf) {
        $ancho3 = 10;
        $alto1 = 8;
        $pdf->SetXY(105, 250);
        $pdf->SetFont('Arial', 'B' . 'I', 8);
        $pdf->Cell($ancho3, $alto1, utf8_decode('Pertinencia Social y Participación Popular'), 0, 0, 'C');
    }

    public function horario($pdf, $output, $lapso, $cedula) {
        $lapso = VariablesGlobales::$lapsoDeInscripcion;
        $controlinscripcionServicio = ControlInscripcionService::getInstance($this->dbAdapter);
        $controlInscripcion = $controlinscripcionServicio->obtenerInscripcionSegunCedulaAlumnoYLapsoInscripcion($cedula, $lapso);
        $entrada = $controlInscripcion->getEntrada();
        $entradaLapso = substr($lapso, 4);
        switch ($entradaLapso) {
            case '11':
                switch ($entrada) {
                    case 1:
                        $fase = '1';
                        break;
                    case 2:
                        $fase = '2';
                        break;
                    case 4:
                    case 5:
                        $fase = 'Inicial';
                        break;
                    default:
                        break;
                }
                break;
            case '21':
                switch ($entrada) {
                    case 1:
                        $fase = '2';
                        break;
                    case 2:
                        $fase = '1';
                        break;
                    case 4:
                    case 5:
                        $fase = 'Inicial';
                        break;
                    default:
                        break;
                }
                break;
            default:
                break;
        }
        $servicioOrganizacionSeccion = OrganizacionSeccionService::getInstance($this->dbAdapter);
        $organizacionService = $servicioOrganizacionSeccion->getHorariosSegunCedulaLapsoYFase($cedula, $lapso, $fase);
        $longitud = count($organizacionService['data']);
        //print_r($organizacionService['data']);
        $pdf->SetFont('Arial', 'B', 8, 'h');
        $pdf->SetFillColor(200);
        $pdf->Ln(1);
        $pdf->Cell(196, 4, 'HORARIO DE CLASES', 1, 1, 'C', true);
        for ($j = 0; $j < $longitud; $j++) {
            $idMateria = strtoupper($organizacionService['data'][$j]['idMateria']);
            $horario = $organizacionService['data'][$j]['horario'];
            $longitudHorario = count($horario);
            for ($i = 0; $i < $longitudHorario; $i++) {
                //echo $horario[$i][0]['_aula'];
                $idaula = strtoupper($horario[$i][0]['_aula']);
                $dia = $horario[$i][0]['_bloque']['_dia'];
                $hora = $horario[$i][0]['_bloque']['_hora'];
                $turno = $horario[$i][0]['_bloque']['_turno'];
                $arrayHorario[$turno][$dia][$hora] = $idMateria;
                $arrayAula[$turno][$dia][$hora] = $idaula;
            }
        }
        $ancho1 = 19;
        $ancho2 = 6;
        $alto1 = 3;
        $numBloques = 7;
        //Ciclo que recorre los turnos
        for ($j = 1; $j <= 3; $j++) {
            $pdf->Ln(2);
            $this->encabezadoHorario($pdf, $j);
            $pdf->Ln(1);
            if ($j == 2) {
                $numBloques = 6;
            }
            //Ciclo que recorre los bloques
            switch ($j) {
                case 1:
                    $a = 1;
                    $b = 7;
                    break;
                case 2:
                    $a = 8;
                    $b = 13;
                    break;
                case 3:
                    $a = 14;
                    $b = 19;
                    break;
                default:
                    break;
            }
            $k = 0;
            for ($m = $a; $m <= $b; $m++) {
                $k++;
                $pdf->SetFont('Arial', '', 6);
                $this->bloquesHoras($pdf, $j, $k, $ancho1, $ancho2, $alto1);
                //Ciclo que recorre los dias de la semana
                for ($i = 1; $i <= 7; $i++) {
                    if (isset($arrayHorario[$j][$i][$m])) {
                        $pdf->SetFont('Arial', '', 6);
                        $pdf->Cell($ancho1, $alto1, $arrayHorario[$j][$i][$m], 1, 0, 'L');
                    } else {
                        $pdf->Cell($ancho1, $alto1, '', 1, 0, 'L');
                    }
                    if (isset($arrayAula[$j][$i][$m])) {
                        $pdf->SetFont('Arial', '', 5);
                        $pdf->Cell($ancho2, $alto1, $arrayAula[$j][$i][$m], 1, 0, 'L');
                    } else {
                        $pdf->Cell($ancho2, $alto1, '', 1, 0, 'L');
                    }
                }
                $pdf->Ln(4);
            }
        }
        $this->detalleCondicion($pdf, $fase);
    }

    public function encabezadoHorario($pdf, $turno) {
        $ancho1 = 19;
        $ancho2 = 6;
        $alto1 = 4;
        $pdf->SetFont('Arial', 'B' . 'I', 8);
        switch ($turno) {
            case 1:
                $pdf->Cell($ancho1, $alto1, utf8_decode('MAÑANA'), 1, 0, 'C', true);
                break;
            case 2:
                $pdf->Cell($ancho1, $alto1, utf8_decode('TARDE'), 1, 0, 'C', true);
                break;
            case 3:
                $pdf->Cell($ancho1, $alto1, utf8_decode('NOCHE'), 1, 0, 'C', true);
                break;
            default:
                break;
        }
        $pdf->Cell($ancho1, $alto1, 'LUNES', 1, 0, 'C', true);
        $pdf->Cell($ancho2, $alto1, 'A', 1, 0, 'C', true);
        $pdf->Cell($ancho1, $alto1, 'MARTES', 1, 0, 'C', true);
        $pdf->Cell($ancho2, $alto1, 'A', 1, 0, 'C', true);
        $pdf->Cell($ancho1, $alto1, 'MIERCOLES', 1, 0, 'C', true);
        $pdf->Cell($ancho2, $alto1, 'A', 1, 0, 'C', true);
        $pdf->Cell($ancho1, $alto1, 'JUEVES', 1, 0, 'C', true);
        $pdf->Cell($ancho2, $alto1, 'A', 1, 0, 'C', true);
        $pdf->Cell($ancho1, $alto1, 'VIERNES', 1, 0, 'C', true);
        $pdf->Cell($ancho2, $alto1, 'A', 1, 0, 'C', true);
        $pdf->Cell($ancho1, $alto1, 'SABADO', 1, 0, 'C', true);
        $pdf->Cell($ancho2, $alto1, 'A', 1, 0, 'C', true);
        $pdf->Cell($ancho1, $alto1, 'DOMINGO', 1, 0, 'C', true);
        $pdf->Cell($ancho2, $alto1, 'A', 1, 1, 'C', true);
    }

    public function bloquesHoras($pdf, $j, $k, $ancho1, $ancho2, $alto1) {
        switch ($j) {
            case 1:
                switch ($k) {
                    case 1:
                        $pdf->Cell($ancho1, $alto1, '7:20 - 8:05', 1, 0, 'L');
                        break;
                    case 2:
                        $pdf->Cell($ancho1, $alto1, '8:05 - 8:50', 1, 0, 'L');
                        break;
                    case 3:
                        $pdf->Cell($ancho1, $alto1, '8:55 - 9:40', 1, 0, 'L');
                        break;
                    case 4:
                        $pdf->Cell($ancho1, $alto1, '9:40 - 10:25', 1, 0, 'L');
                        break;
                    case 5:
                        $pdf->Cell($ancho1, $alto1, '10:30 - 11:15', 1, 0, 'L');
                        break;
                    case 6:
                        $pdf->Cell($ancho1, $alto1, '11:15 - 12:00', 1, 0, 'L');
                        break;
                    case 7:
                        $pdf->Cell($ancho1, $alto1, '12:05-12:50', 1, 0, 'L');
                        break;
                    default:
                        break;
                }
                break;
            case 2:
                switch ($k) {
                    case 1:
                        $pdf->Cell($ancho1, $alto1, '1:20-2:05', 1, 0, 'L');
                        break;
                    case 2:
                        $pdf->Cell($ancho1, $alto1, '2:05-2:50', 1, 0, 'L');
                        break;
                    case 3:
                        $pdf->Cell($ancho1, $alto1, '2:55-3:40', 1, 0, 'L');
                        break;
                    case 4:
                        $pdf->Cell($ancho1, $alto1, '3:40-4:25', 1, 0, 'L');
                        break;
                    case 5:
                        $pdf->Cell($ancho1, $alto1, '4:30-5:15', 1, 0, 'L');
                        break;
                    case 6:
                        $pdf->Cell($ancho1, $alto1, '5:15-6:00', 1, 0, 'L');
                        break;
                    default:
                        break;
                }
                break;
            case 3:
                switch ($k) {
                    case 1:
                        $pdf->Cell($ancho1, $alto1, '6:00-6:45', 1, 0, 'L');
                        break;
                    case 2:
                        $pdf->Cell($ancho1, $alto1, '6:45-7:30', 1, 0, 'L');
                        break;
                    case 3:
                        $pdf->Cell($ancho1, $alto1, '7:35-8:20', 1, 0, 'L');
                        break;
                    case 4:
                        $pdf->Cell($ancho1, $alto1, '8:20-9:05', 1, 0, 'L');
                        break;
                    case 5:
                        $pdf->Cell($ancho1, $alto1, '9:10-9:55', 1, 0, 'L');
                        break;
                    case 6:
                        $pdf->Cell($ancho1, $alto1, '9:55-10:40', 1, 0, 'L');
                        break;
                    default:
                        break;
                }
                break;
            default:
                break;
        }
    }

    public function detalleCondicion($pdf, $fase) {
        $pdf->Ln(2);
        $pdf->SetFont('Arial', 'B', 9);
        $pdf->Cell(194, 10, utf8_decode('Su Condición es ANUAL, le corresponde en este lapso académico cursar las Unidades Curriculares de Fase' . " " . $fase . " " . 'y las Anuales'), 1, 1, 'C', true);
    }

    public function codigoSeguridad($pdf, $cedula, $fecha, $hora, $ancho, $alto) {
        $codigoSeguridad = Seguridad::encriptarString($cedula . '/' . $fecha . '/' . $hora);
        $pdf->SetFont('Arial', 'B' . 'I', 8);
        $pdf->Cell($ancho, $alto, utf8_decode("Código de Seguridad:"), 0, 1, 'R', false);
        $pdf->SetFont('Arial', 'I', 8);
        $pdf->Cell($ancho, $alto, $codigoSeguridad, 0, 1, 'R', false);
        $servicioControlInscripcion = ControlInscripcionService::getInstance($this->dbAdapter);
        $respuesta = $servicioControlInscripcion->actualizarCodigoDeSeguridad($cedula, $codigoSeguridad, $fecha);
    }

}

?>
